package dac.dao;

import dac.model.Produto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class ProdutoDAO {
    
    private Connection con;
    private HttpSession session;
    
    public ProdutoDAO (Connection con) {
        this.con = con;
    }
    
    public ProdutoDAO () {
    }
    
    public void setSession(HttpSession session){
        this.session = session;
    }
    
    
    /*
    * Cadastro
    */
    public String cadastroProduto(Map params) throws SQLException{
        Iterator i = params.keySet().iterator();
        String[] possivel = new String[]{
                "categoria_id", "nome", "imagem", "tempo_preparo", "quantidade", "preco", "descricao"
        };
        String SQLValues = "",
               SQLFields = "";
        
        while ( i.hasNext() ) {
            String key = (String) i.next();
            String value = ((String[]) params.get( key ))[ 0 ];
                        
            if( Arrays.asList(possivel).contains(key) && !value.isEmpty()  ) {
                    SQLFields += key + ",";
                    SQLValues += "'" + value + "',";
            }
        }
        // Remove a ultima ','
        SQLFields = SQLFields.substring(0, SQLFields.length()-1);
        SQLValues = SQLValues.substring(0, SQLValues.length()-1);
        
        String query = "INSERT INTO produto ("+SQLFields+") ";
              query += "VALUES ("+SQLValues+")";
//              return query;
              
        PreparedStatement st = con.prepareStatement(query);
        int rs = st.executeUpdate();
        
        if (rs==1) {
            return "true";
        }
        
        return "false";
    }
    
    
    /*
    * Lista em Object
    */
    public List<Produto> listarTodos() throws SQLException {
        List<Produto> resultado = new ArrayList<Produto>();
        
        String query = "SELECT p.*, c.nome AS cat_nome FROM produto p " +
                        "LEFT JOIN categoria c ON p.categoria_id = c.id ";
        
        PreparedStatement st = con.prepareStatement(query);
        
        ResultSet rs = st.executeQuery();
        
        while (rs.next()) {
            Produto p = new Produto();
            p.setId( Integer.parseInt(rs.getString("id")) );
            p.setCategoria_id( Integer.parseInt(rs.getString("categoria_id")) );
            p.setNome( rs.getString("nome") );
            p.setImagem( rs.getString("imagem") );
            p.setTempo_preparo( rs.getString("tempo_preparo") );
            p.setQuantidade( Integer.parseInt(rs.getString("quantidade")) );
            p.setPreco( Double.parseDouble(rs.getString("preco")) );
            p.setDescricao( rs.getString("descricao") );
            p.setCategoria_nome(rs.getString("cat_nome") );
            
            resultado.add(p);
        }
        
        return resultado;
    }
    
    
    
    /*
    * Lista em JSON
    */
    public String listarTodosJSON() throws SQLException {        
        String query = "SELECT p.*, c.nome AS cat_nome FROM produto p " +
                        "LEFT JOIN categoria c ON p.categoria_id = c.id ";
        
        PreparedStatement st = con.prepareStatement(query);
        ResultSet rs = st.executeQuery();
        
        
        JSONArray jsonArray = new JSONArray();
        
        while (rs.next()) {
            JSONObject jsonObject = new JSONObject();
            
            jsonObject.put("id", Integer.parseInt(rs.getString("id")) );
            jsonObject.put("categoria_id", Integer.parseInt(rs.getString("categoria_id")) );
            jsonObject.put("nome", rs.getString("nome") );
            jsonObject.put("imagem", rs.getString("imagem") );
            jsonObject.put("tempo_preparo", rs.getString("tempo_preparo") );
            jsonObject.put("quantidade", Integer.parseInt(rs.getString("quantidade")) );
            jsonObject.put("preco", rs.getString("preco") );
            jsonObject.put("descricao", rs.getString("descricao") );
            jsonObject.put("cat_nome", rs.getString("cat_nome") );
            
            jsonArray.add(jsonObject);
        }
        
        if ( jsonArray.isEmpty() ){
            return "false";
        }
        return jsonArray.toString();
    }
        

    
    /*
    * Lista em JSON (categoria)
    */
    public String listarTodosCategoriaJSON(String id_categoria) throws SQLException {   
        String query = "SELECT p.*, c.nome AS cat_nome FROM produto p " +
                        "LEFT JOIN categoria c ON p.categoria_id = c.id " +
                        "WHERE p.categoria_id="+id_categoria;
        
        PreparedStatement st = con.prepareStatement(query);
        ResultSet rs = st.executeQuery();
        
        
        JSONArray jsonArray = new JSONArray();
        
        while (rs.next()) {
            JSONObject jsonObject = new JSONObject();
            
            jsonObject.put("id", Integer.parseInt(rs.getString("id")) );
            jsonObject.put("categoria_id", Integer.parseInt(rs.getString("categoria_id")) );
            jsonObject.put("nome", rs.getString("nome") );
            jsonObject.put("imagem", rs.getString("imagem") );
            jsonObject.put("tempo_preparo", rs.getString("tempo_preparo") );
            jsonObject.put("quantidade", Integer.parseInt(rs.getString("quantidade")) );
            jsonObject.put("preco", rs.getString("preco") );
            jsonObject.put("descricao", rs.getString("descricao") );
            jsonObject.put("cat_nome", rs.getString("cat_nome") );
            
            jsonArray.add(jsonObject);
        }
        
        if ( jsonArray.isEmpty() ){
            return "false";
        }
        return jsonArray.toString();
    }
    
    /*
    * Exibe Um produto, coloca na session !
    */
    public String exibeUmProduto(String id_produto) throws SQLException {
        List<Produto> resultado = new ArrayList<Produto>();
        
        String query = "SELECT p.*, c.nome AS cat_nome FROM produto p " +
                        "LEFT JOIN categoria c ON p.categoria_id = c.id " +
                        "WHERE p.id="+id_produto;
        
        PreparedStatement st = con.prepareStatement(query);
        ResultSet rs = st.executeQuery();
        
        while (rs.next()) {
            Produto p = new Produto();
            p.setId( Integer.parseInt(rs.getString("id")) );
            p.setCategoria_id( Integer.parseInt(rs.getString("categoria_id")) );
            p.setNome( rs.getString("nome") );
            p.setImagem( rs.getString("imagem") );
            p.setTempo_preparo( rs.getString("tempo_preparo") );
            p.setQuantidade( Integer.parseInt(rs.getString("quantidade")) );
            p.setPreco( Double.parseDouble(rs.getString("preco")) );
            p.setDescricao( rs.getString("descricao") );
            p.setCategoria_nome( rs.getString("cat_nome") );
            
            resultado.add(p);
            
            this.session.setAttribute("produto", p);
            return "true";
        }
        
        return "false";
        
        //return resultado;
    }
    
    
    /*
    * Serve para mostrar os itens que estao no carrinho
    */
    public String exibeMultiProdutoJSON(String itens) throws SQLException {
        String query = "SELECT p.*, c.nome AS cat_nome FROM produto p " +
                        "LEFT JOIN categoria c ON p.categoria_id = c.id " +
                        "WHERE p.id IN ("+itens+")";
        
        PreparedStatement st = con.prepareStatement(query);
        ResultSet rs = st.executeQuery();
        
        
        JSONArray jsonArray = new JSONArray();
        
        while (rs.next()) {
            JSONObject jsonObject = new JSONObject();
            
            jsonObject.put("id", Integer.parseInt(rs.getString("id")) );
            jsonObject.put("categoria_id", Integer.parseInt(rs.getString("categoria_id")) );
            jsonObject.put("nome", rs.getString("nome") );
            jsonObject.put("imagem", rs.getString("imagem") );
            jsonObject.put("tempo_preparo", rs.getString("tempo_preparo") );
            jsonObject.put("quantidade", Integer.parseInt(rs.getString("quantidade")) );
            jsonObject.put("preco", rs.getString("preco") );
            jsonObject.put("descricao", rs.getString("descricao") );
            jsonObject.put("cat_nome", rs.getString("cat_nome") );
            
            jsonArray.add(jsonObject);
        }
        
        if ( jsonArray.isEmpty() ){
            return "false";
        }
        return jsonArray.toString();
    }

}
